#ifndef MY_RENDER_OBJECT
#define MY_RENDER_OBJECT

#include <vector>

#include"../dot.hpp"
#include"./triangle.hpp"
#include"../matrix44.hpp"
#include"../vector4.hpp"
#include"../transformation/move.hpp"
#include"../transformation/rotation.hpp"

namespace object{
    // 这是所有物体的基类，只有 中心，顶点，初始旋转。
    class Object{
        public:
        Dot position;
        Vector4 rotation;
        std::vector<Dot> vertices;
        // 进行旋转
        void rotate(float x,float y,float z){
            // 首先得到返回原点的矩阵
            Matrix44 move=transformation::Move::MoveXYZ(-position.x,-position.y,-position.z);
            // 然后得到旋转矩阵
            Matrix44 rotate=transformation::Rotation::Rotate(x,y,z);
            // 然后得到返回原点的矩阵
            Matrix44 moveBack=transformation::Move::MoveXYZ(position.x,position.y,position.z);
            // 得到最终矩阵
            Matrix44 final=moveBack*rotate*move;
            // 进行旋转运算
            for(int i=0;i<vertices.size();i++){
                Vector4 v=Vector4(vertices[i].x,vertices[i].y,vertices[i].z,1);
                v=final*v;
                vertices[i]=Dot(v.x,v.y,v.z);
            }
        }
        // 进行平移
        void move(float x,float y,float z){
            // 得到移动的矩阵
            Matrix44 move=transformation::Move::MoveXYZ(-position.x,-position.y,-position.z);
            // 进行平移运算
            for(int i=0;i<vertices.size();i++){
                Vector4 v=Vector4(vertices[i].x,vertices[i].y,vertices[i].z,1);
                v=move*v;
                vertices[i]=Dot(v.x,v.y,v.z);
            }
        }
        Object(){};
        Object(Dot position):position(position){};
        // 这个需要谨慎使用，因为没有调用旋转函数，需要手动调用
        Object(Dot position,Vector4 rotation):position(position),rotation(rotation){};
        Object(std::vector<Dot> vertices,Dot position):vertices(vertices),position(position){};
        Object(std::vector<Dot> vertices,Dot position,Vector4 rotation):vertices(vertices),position(position),rotation(rotation){
            rotate(rotation.x,rotation.y,rotation.z);
        };
        // 自身进行旋转
        
    };

    // 我开始觉得这个有必要，但是仔细梳理之后发现这个东西很蠢
    // class ColorObject:Object{
    //     public :
    //     std::vector<ColorTriangle> colorTriangles;
    //     ColorObject(std::vector<Dot> vertices,Dot position,std::vector<ColorTriangle> colorTriangles):Object(vertices,position),colorTriangles(colorTriangles){};
    // };






}
#endif